package proceso.consulta.ubicacion;

import java.util.ArrayList;
import java.util.List;

import modelo.pozo.PozoProduccion;

import org.hibernate.Session;

import proceso.busqueda.BuscarSectorDePertenencia;
import proceso.busqueda.BuscarZonaRiego;
import proceso.busqueda.RecuperarPozosVecinos;
import proceso.busqueda.RecuperarPunto;

import hibernate.HibernateUtil;
import interfazData.DesValoresPunto;
import interfazData.PozoResumen;

public class ConsultaSobrePunto {

	private DesValoresPunto valoresPunto = new DesValoresPunto();
	private String razon;

	public DesValoresPunto getValoresPunto() {
		return valoresPunto;
	}

	public void setValoresPunto(DesValoresPunto valoresPunto) {
		this.valoresPunto = valoresPunto;
	}
	
	public String getRazon() {
		return razon;
	}

	public void setRazon(String razon) {
		this.razon = razon;
	}

	public boolean recuperarInformacion(double este, double norte, double distancia){
		boolean resultado; 
		double aux;
		double cotaTerreno;
		double t,s,q;
		boolean validezInformacion = true;
		PozoResumen pozoAux;
		PozoProduccion pozoProdAux;
		valoresPunto.setEste(Double.toString(este));
		valoresPunto.setNorte(Double.toString(norte));
		Session sess = HibernateUtil.currentSession();
		// recuperar las mallas.

		RecuperarPunto recuperar = new RecuperarPunto();
		resultado = recuperar.atributoUnico(sess, "Mapa Digital de Terreno Valle de Quibor CIDIAT-ULA rev. 2011", este, norte);
		if(!resultado){
			razon = "Para la malla de terreno " + recuperar.getRazon();
			return false;
		}
		cotaTerreno = recuperar.getValor();
		valoresPunto.setCotaTerreno(Double.toString(cotaTerreno));
		boolean valEspesor = true;
		double espesorAgua = 0;

		resultado = recuperar.atributoUnico(sess, "Profundidad Techo de Roca Valle de Quibor", este, norte);
		if(resultado) {
			valoresPunto.setCotaTechoRoca(Double.toString(recuperar.getValor()));
			espesorAgua = recuperar.getValor();
		}
		else{
			valoresPunto.setCotaTechoRoca("N/A");
			valEspesor = false;
		}

		resultado = recuperar.recuperarPunto(sess, "Nivel de Agua Valle de Quibor", "Nivel de Agua 2009", este, norte);
		aux = 0;
		if(resultado) {
			valoresPunto.setCotaNivelAgua(Double.toString(recuperar.getValor()));
			aux = cotaTerreno - recuperar.getValor();
			valoresPunto.setProundidadAgua(Double.toString(aux));
		}
		else{
			valoresPunto.setCotaNivelAgua("N/A");
			valoresPunto.setProundidadAgua("N/A");
			valEspesor = false;
		}
		if(valEspesor){
			valoresPunto.setEspesorAgua(Double.toString( espesorAgua -  aux));
		}
		else {
			valoresPunto.setEspesorAgua("N/A");
		}

		resultado = recuperar.recuperarPunto(sess, "Ph Acuifero Quibor", "Nivel de Ph 2005", este, norte);
		if(resultado) {
			valoresPunto.setPh(Double.toString(recuperar.getValor()));
		}
		else {
			valoresPunto.setPh("N/A");
		}

		resultado = recuperar.recuperarPunto(sess, "Conductividad Electrica", "Conductividad Electrica 2005", este, norte);
		if(resultado) {
			valoresPunto.setCe(Double.toString(recuperar.getValor()));
		}
		else {
			valoresPunto.setCe("N/A");
		}
		// colocar en 0 los valores
		t=s=q=0;
		resultado = recuperar.recuperarPunto(sess, "Coeficiente de almacenamiento", "Coeficiente de almacenamiento (Storage)", este, norte);
		if(resultado) {
			valoresPunto.setCapAlm(Double.toString(recuperar.getValor()));
			s = recuperar.getValor();
		}
		else {
			valoresPunto.setCapAlm("N/A");
			validezInformacion = false;
		}
		resultado = recuperar.recuperarPunto(sess, "Transmisividad", "Transmisividad", este, norte);
		if(resultado) {
			valoresPunto.setTransmisividad(Double.toString(recuperar.getValor()));
			t = recuperar.getValor();
		}
		else {
			valoresPunto.setTransmisividad("N/A");
			validezInformacion = false;
		}

		resultado = recuperar.recuperarPunto(sess, "Caudales", "Caudal 2005", este, norte);
		if(resultado) {
			
			valoresPunto.setCaudalEstimado(Double.toString(recuperar.getValor()));
			q = recuperar.getValor();
		}
		else {
			valoresPunto.setSector(recuperar.getRazon());
			validezInformacion = false;
		}

		
		resultado = recuperar.recuperarPunto(sess, "Sectores de Riego", "Sector de riego", este, norte);
		if(resultado) {
			
			valoresPunto.setSector(Double.toString(recuperar.getValor()));
		}
		else {
			valoresPunto.setSector(recuperar.getRazon());
		}
		

		
		BuscarSectorDePertenencia  buscarSector = new BuscarSectorDePertenencia();
		
		if(buscarSector.buscar(sess, "Region de riego del Valle de Quibor", este, norte)) {
			valoresPunto.setSectorPol(buscarSector.getSector().getNombre());
		}
		else{
			valoresPunto.setSectorPol(buscarSector.getRazon());
		}
		
		BuscarZonaRiego buscarZona = new BuscarZonaRiego();

		if(buscarZona.buscar(sess, "Region de riego del Valle de Quibor", este, norte)) {
			valoresPunto.setZona(buscarZona.getZona().getNombre());
		}
		else{
			valoresPunto.setZona(buscarZona.getRazon());
		}
		if(validezInformacion){
			RadioDeInfluencia calRad = new RadioDeInfluencia();
			double res;
			String abatimiento ;
			res = calRad.calcular(t, s, q, 0);
			valoresPunto.setRadioDeInfluencia(Double.toString(res));
			res = calRad.calcular(t, s, q, (float)0.25);	
			valoresPunto.setAbatimiento_25("0,25 mts " + Double.toString(res));
			res = calRad.calcular(t, s, q, (float)0.5);
			valoresPunto.setAbatimiento_50("0,50 mts " + Double.toString(res));
			res = calRad.calcular(t, s, q, (float)0.75);
			valoresPunto.setAbatimiento_75("0,75 mts " + Double.toString(res));
			res = calRad.calcular(t, s, q, (float)1.0);
			valoresPunto.setAbatimiento_100("1,00 mts " + Double.toString(res));
			res = calRad.calcular(t, s, q, (float)1.25);
			valoresPunto.setAbatimiento_125("1,25 mts " + Double.toString(res));
		}
		

		
		RecuperarPozosVecinos recupPV = new RecuperarPozosVecinos();
		resultado = recupPV.buscar(sess, este, norte, distancia);
		if(resultado){
			int posCaudal, posProp;
			for(int i = 0; i < recupPV.getPozosVecinosActivos().size(); i++){
				pozoProdAux = recupPV.getPozosVecinosActivos().get(i);
				posCaudal = pozoProdAux.getListaCaudalMedido().size();
				pozoAux = new PozoResumen();
				pozoAux.setCodigo(pozoProdAux.getCodigo());
				if(posCaudal != 0) {
					pozoAux.setProduccion(pozoProdAux.getListaCaudalMedido().get(posCaudal-1).getGasto());
				}
				pozoAux.setOperativo(true);
				pozoAux.setPropiedad(pozoProdAux.getUbicacion().getNombre());
				posProp = pozoProdAux.getUbicacion().getListaRegistro().size();
				if(posProp!= 0) {
					pozoAux.setPropietario(pozoProdAux.getUbicacion().getListaRegistro().get(posProp-1).getPropietario().getNombreProvisional());
				}
				else {
					pozoAux.setPropietario("Sin informacion");
				}
				pozoAux.setNorte(pozoProdAux.getNorte());
				pozoAux.setEste(pozoProdAux.getEste());
				pozoAux.setDistancia(Math.sqrt((este - pozoProdAux.getEste())*(este - pozoProdAux.getEste()) +  (norte - pozoProdAux.getNorte())*(norte - pozoProdAux.getNorte())));
				valoresPunto.agregarPozoVecinoActivo(pozoAux);
			}
			for(int i = 0; i < recupPV.getTotalPozos().size(); i++){
				pozoProdAux = recupPV.getTotalPozos().get(i);
				posCaudal = pozoProdAux.getListaCaudalMedido().size();
				pozoAux = new PozoResumen();
				if(posCaudal != 0) {
					pozoAux.setProduccion(pozoProdAux.getListaCaudalMedido().get(posCaudal-1).getGasto());
				}
				pozoAux.setOperativo(pozoProdAux.isOperativo());
				pozoAux.setPropiedad(pozoProdAux.getUbicacion().getNombre());
				posProp = pozoProdAux.getUbicacion().getListaRegistro().size();
				if(posProp!= 0) {
					pozoAux.setPropietario(pozoProdAux.getUbicacion().getListaRegistro().get(posProp-1).getPropietario().getNombreProvisional());
				}
				else {
					pozoAux.setPropietario("Sin informacion");
				}

				pozoAux.setNorte(pozoProdAux.getNorte());
				pozoAux.setEste(pozoProdAux.getEste());
				pozoAux.setDistancia(Math.sqrt((este - pozoProdAux.getEste())*(este - pozoProdAux.getEste()) +  (norte - pozoProdAux.getNorte())*(norte - pozoProdAux.getNorte())));
				valoresPunto.agregarPozoVecino(pozoAux);
			}
			// Busqueda del sector
			
		}
		
		sess.close();
		
		return true;
	}
}
